package com.zh.risk.quartz.merchant;

import com.zh.risk.dao.RiskCornDao;
import com.zh.risk.entity.RiskCronConf;

import com.zh.risk.entity.RiskMerchTrans;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.ScheduledFuture;

/**
 * code is far away from bug with the animal protecting
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @Description: 商户端风控处理定时任务
 * @Author: Liard
 * @Create in: 2020/7/7 11:37
 * @Version: 1.0.1
 */
@Component
@EnableScheduling
public class MerchantRiskTaskGroup {

    private Map<String, ScheduledFuture<?>> taskMap = new HashMap<>();

    @Autowired
    private RiskCornDao cornDao;

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    /** 需要执行的任务列表 */
    private List<RiskCronConf> confList;

    @PostConstruct
    private void getCronList() {
        confList = cornDao.getRiskCronTask();
        confList.stream().forEach(t -> {
            t.setListTpl(cornDao.getRiskTask(t.getRiskTransComponentId()));
            add(t);
        });

    }


    /** 添加定时任务 */
    private boolean add(RiskCronConf conf) {
        if (null != taskMap.get(conf.getName())) {
            return false;
        }
        ScheduledFuture<?> schedule = threadPoolTaskScheduler.schedule(new QuartzTaskService(conf), new CronTrigger(conf.getCron()));
        taskMap.put(conf.getName(), schedule);
        return true;
    }

    /** 移除定时任务 */
    private boolean stop(RiskCronConf conf) {
            if(null == taskMap.get(conf.getName())) {
                    return false;
                }
            ScheduledFuture<?> scheduledFuture = taskMap.get(conf.getName());
            scheduledFuture.cancel(true);
            taskMap.remove(conf.getName());
            return true;
        }
}
